package com.no1.musicmgr.util;

import com.no1.musicmgr.vo.Imgcode;
import lombok.extern.log4j.Log4j;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import redis.clients.jedis.Jedis;

@Log4j
public class CodeUtil {
    public static void main(String[] args) {

        String code = getCode01(6); // 生成长度为6的验证码
        System.out.println("Generated code: " + code);

        // 将验证码存入 Redis
        saveCodeToRedis("code_key", code);
        System.out.println("Code saved to Redis.");

        // 从 Redis 中获取验证码
        String retrievedCode = getCodeFromRedis("code_key");
        System.out.println("Retrieved code from Redis: " + retrievedCode);
    }


    /**
     * 将字符串转换为图片并保存到指定路径。
     *
     * @param n 几位数验证码
     * @return code     验证码
     */
    public static String getCode01(int n) {
        Random r = new Random();
        String code = "";
        for (int i = 0; i < n; i++) {
            int type = r.nextInt(3);
            if (type == 0) {
                code += (char) (r.nextInt(26) + 65);
            } else if (type == 1) {
                code += (char) (r.nextInt(26) + 97);
            } else {
                code += r.nextInt(10);
            }
        }
        return code;
    }


    /**
     * 将字符串转换为图片并保存到指定路径。
     *
     * @param n n以内的加减乘除随机数
     * @return code     验证码
     */
    public static Imgcode getCode02(int n) {
        Imgcode imgcode = new Imgcode();
        Random r = new Random();
        String code = "";
        int res = 0;
        char[] chars = {'+', '-', '*', '/'};
        int type = r.nextInt(4);
//        type = 3; // 固定为除法
        int x = 0;
        int y = 0;

        // 确保生成的x和y能够整除
        do {
            x = r.nextInt(n) + 1; // 避免x为0
            y = r.nextInt(x) + 1; // 确保y <= x
        } while (x % y != 0);

        switch (type) {
            case 0:
                res = x + y;
                break;
            case 1:
                if (x < y) {
                    // 交换x和y的值
                    int temp = x;
                    x = y;
                    y = temp;
                }
                res = x - y;
                break;
            case 2:
                res = x * y;
                break;
            case 3:
                res = x / y;
                break;
        }

        code = x + " " + chars[type] + " " + y + " = ?";
        imgcode.setCode(code);
        imgcode.setRes(res);
        return imgcode;
    }


    // 将验证码存入 Redis 的方法
    public static void saveCodeToRedis(String key, String code) {
        try (Jedis jedis = new Jedis("localhost", 6379)) {
            // 如果 Redis 有设置密码，则需要认证
//            String redisPassword = "redis";
//            if (redisPassword != null && !redisPassword.isEmpty()) {
//                jedis.auth(redisPassword);
//            }
            // 设置键值对
            jedis.set(key, code);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 从 Redis 中获取验证码的方法
    public static String getCodeFromRedis(String key) {
        try (Jedis jedis = new Jedis("localhost", 6379)) {
            // 如果 Redis 有设置密码，则需要认证
//            String redisPassword = "redis";
//            if (redisPassword != null && !redisPassword.isEmpty()) {
//                jedis.auth(redisPassword);
//            }
            // 获取键对应的值
            String code = jedis.get(key);
            return code;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static String codeImgFile() {
        // 获取当前日期时间
        LocalDateTime now = LocalDateTime.now();

        // 定义日期时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss");

        // 格式化日期时间
        String formattedDateTime = now.format(formatter);

        return formattedDateTime;
    }

}
